package main

import "fmt"

// 代理模式为其他对象提供一种代理以控制对这个对象的访问。在代理模式中，我们创建具有现有对象的对象，以便向外界提供功能接口。
// 代理模式通常用于延迟加载、访问控制、日志记录等场景。

// Subject 主题接口
type Subject interface {
	Request() string
}

// RealSubject 真实主题
type RealSubject struct{}

func (rs *RealSubject) Request() string {
	return "RealSubject: Handling request."
}

// Proxy 代理主题
type Proxy struct {
	realSubject *RealSubject
}

func (p *Proxy) Request() string {
	if p.realSubject == nil {
		p.realSubject = &RealSubject{}
	}
	return "Proxy: Logging before request.\n" + p.realSubject.Request() + "\nProxy: Logging after request."
}

func main() {
	proxy := &Proxy{}
	fmt.Println(proxy.Request())
}
